import dayjs from 'dayjs';

/**
 *
 * dateFormat方法的选项
 * @interface IDateFormatOptions
 */
interface IDateFormatOptions {
  /** 输出格式,默认为YYYY-MM-DD HH:mm:ss */
  format?: string;
  /** 时间戳不能正确格式化的时候输出fallback，默认为‘--’ */
  fallback?: string;
  /** 是否是毫秒时间戳，默认为true */
  isMillisecond?: boolean;
  /** 是否自动认为10位时间戳是秒时间戳，默认为true */
  autoTenSecond?: boolean;
}

/**
 *
 * 格式化时间戳，默认输出格式为YYYY-MM-DD HH:mm:ss。不能正确格式化的时候输出fallback，默认为‘--’
 * @exports
 * @since 1.0.4
 * @example
 * dateFormat(1602491858395) // 2020-10-12 16:37:38
 * dateFormat(1602491858) // 2020-10-12 16:37:38
 * @param {(number | string)} [timeStamp] 时间戳
 * @param {IDateFormatOptions} [options] 选项
 * @param {string} [options.format] 输出格式,默认为YYYY-MM-DD HH:mm:ss
 * @param {string} [options.fallback] 时间戳不能正确格式化的时候输出fallback，默认为‘--’
 * @param {boolean} [options.isMillisecond] 是否是毫秒时间戳，默认为true
 * @param {boolean} [options.autoTenSecond] 是否自动认为10位时间戳是秒时间戳，默认为true
 * @return {string} 格式化后的时间戳
 */
export default function dateFormat(
  timeStamp?:number | string,
  {
    format = 'YYYY-MM-DD HH:mm:ss', fallback = '--', isMillisecond = true, autoTenSecond = true,
  }:IDateFormatOptions = {},
):string {
  // 参数格式检查
  if (timeStamp === undefined || timeStamp === null || (typeof timeStamp !== 'number' && typeof timeStamp !== 'string')) {
    return fallback;
  }

  // 如果自动认为10位时间戳是秒时间戳，将isMillisecond赋值为false
  if (autoTenSecond && timeStamp.toString().length === 10) {
    // eslint-disable-next-line no-param-reassign
    isMillisecond = false;
  }

  // 秒时间戳（一般为10位）
  if (!isMillisecond && dayjs.unix(+timeStamp).isValid()) {
    return dayjs.unix(+timeStamp).format(format);
  }

  // 毫秒时间戳（一般为13位）
  if (isMillisecond && dayjs(+timeStamp).isValid()) {
    return dayjs(+timeStamp).format(format);
  }
  return fallback;
}
